#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 基类必须继承于object，否则在派生类中将无法使用super()函数
class Person(object):
    def __init__(self, name='', age=20, sex='man'):
        # 通过调用方法进行初始化，这样可以对参数进行更好的控制
        self.setName(name)
        self.setAge(age)
        self.setSex(sex)

    def setName(self, name):
        if not isinstance(name, str):
            raise Exception('name must be string.')
        self.__name = name

    def setAge(self, age):
        if type(age) != int:
            raise Exception('age must be integer.')
        self.__age = age

    def setSex(self, sex):
        if sex not in ('man', 'woman'):
            raise Exception('sex must be "man" or "woman"')
        self.__sex = sex

    def show(self):
        # sep表示以什么为分隔符，默认是空格，这里'\n'是换行
        print(self.__name, self.__age, self.__sex, sep= '\n')

# 派生类
class Teacher(Person):
    def __init__(self, name='', age=30, sex='man', department='Computer'):
        # 调用基类构造方法初始化基类的私有数据成员
        super(Teacher, self).__init__(name, age, sex)
        #  也可以这样初始化基类的私有数据成员
        # Person.__init__(self, name, age, sex)
        # 调用自己的方法初始化派生类的数据成员
        self.setDepartment(department)

    # 在派生类中新增加的方法
    def setDepartment(self, department):
        if type(department) != str:
            raise Exception('department must ba a string.')
        self.__department = department

    # 覆盖了从父类中继承来的方法
    def show(self):
        # 先调用父类的同名方法，显示从父类中继承来的数据成员
        super(Teacher, self).show()
        # 在显示派生类中的私有数据成员
        print(self.__department)

if __name__ == '__main__':
    # 创建基类对象
    zhangsan = Person('Zhang San', 19, 'man')
    zhangsan.show()
    # 换行，打印30个等于号
    print('='*30)

    # 创建派生类对象
    lisi = Teacher('Li si', 32, 'man', 'Math')
    lisi.show()
    print('='*30)
    #调用继承的方法修改年龄
    lisi.setAge(40)
    lisi.setSex("woman")
    lisi.show()